/*
利用size判断空或满
*/
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

typedef struct Queue
{
    int data[MAXSIZE];
    int rear, front;
    int size;
} Queue;

// 初始化队列
void InitQueue(Queue &Q)
{
    Q.front = Q.rear = Q.size = 0;
}

// 判空
bool Empty(Queue &Q)
{
    return Q.size == 0;
}

// 判满（可选写法）
bool Full(Queue &Q)
{
    return Q.size == MAXSIZE;
}

// 入队
bool InQueue(Queue &Q, int x)
{
    if (Q.size == MAXSIZE)
    {
        return false;
    }
    else
    {
        Q.data[Q.rear] = x;
        Q.rear = (Q.rear + 1) % MAXSIZE;
        Q.size++;
        return true;
    }
}

// 出队
bool OutQueue(Queue &Q, int &x)
{
    if (Q.size == 0)
    {
        return false;
    }
    else
    {
        x = Q.data[Q.front];
        Q.front = (Q.front + 1) % MAXSIZE;
        Q.size--;
        return true;
    }
}

// 获取队头元素
bool GetHead(Queue &Q, int &x)
{
    if (Q.size == 0)
    {
        return false;
    }
    else
    {
        x = Q.data[Q.front];
        return true;
    }
}

int main()
{
    Queue Q;
    InitQueue(Q);

    // 简单测试
    for (int i = 0; i < 12; i++)
    {
        if (InQueue(Q, i))
            printf("入队: %d\n", i);
        else
            printf("队列已满，无法入队: %d\n", i);
    }

    int x;
    while (OutQueue(Q, x))
    {
        printf("出队: %d\n", x);
    }

    return 0;
}
